[PATCH 12/24] lib-imap, global: Add params parameter to imap_parser_create()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 6 Mar 2026 13:25:14 +0000 (15:25 +0200)
committerNoah Meyerhans <noahm@debian.org>
Tue, 31 Mar 2026 19:07:17 +0000 (15:07 -0400)
Gbp-Pq: Name CVE-2026-27857-2.patch

13 files changed:
src/imap-login/imap-login-client.c
src/imap-login/imap-login-cmd-id.c
src/imap/cmd-append.c
src/imap/cmd-setmetadata.c
src/imap/imap-client.c
src/lib-imap-client/imapc-connection.c
src/lib-imap-storage/imap-msgpart.c
src/lib-imap/imap-bodystructure.c
src/lib-imap/imap-envelope.c
src/lib-imap/imap-parser.c
src/lib-imap/imap-parser.h
src/lib-imap/test-imap-parser.c
src/plugins/virtual/virtual-config.c

index a31be22fc3710880e81f87603007207c6f7154d9..f24b90e05200d684ac868898094e7e00678c5ee5 100644 (file)
@@ -382,7 +382,7 @@ static int imap_client_create(struct client *client)
        imap_client->parser =
                imap_parser_create(imap_client->common.input,
                                   imap_client->common.output,
-                                  IMAP_LOGIN_MAX_LINE_LENGTH);
+                                  IMAP_LOGIN_MAX_LINE_LENGTH, NULL);
        struct settings_instance *set_instance = settings_instance_find(client->event);
        if (set_instance == NULL) {
                set_instance = settings_instance_new(
@@ -468,7 +468,7 @@ static void imap_client_starttls(struct client *client)
        imap_client->parser =
                imap_parser_create(imap_client->common.input,
                                   imap_client->common.output,
-                                  IMAP_LOGIN_MAX_LINE_LENGTH);
+                                  IMAP_LOGIN_MAX_LINE_LENGTH, NULL);
 
        /* CRLF is lost from buffer when streams are reopened. */
        imap_client->skip_line = FALSE;
index 572f933da64d5b3b99baa40f6f420c7afb39aa7e..806486d47462aef597c06e4d41c7ead30ffecb68 100644 (file)
@@ -346,7 +346,9 @@ int cmd_id(struct imap_client *client)
                id->params->pool = param_pool;
                id->parser = imap_parser_create(client->common.input,
                                                client->common.output,
-                                               IMAP_LOGIN_MAX_LINE_LENGTH);
+                                               IMAP_LOGIN_MAX_LINE_LENGTH,
+                                               NULL);
+               id->log_reply = str_new(default_pool, 64);
                if (client->set->imap_literal_minus)
                        imap_parser_enable_literal_minus(id->parser);
                parser_flags = IMAP_PARSE_FLAG_STOP_AT_LIST;
index 3c29c1f9c9cbe62e475f5085d608da0a180e8ce6..11da18886a281fc700794fd0e7364b6e71a5ff4f 100644 (file)
@@ -1063,7 +1063,8 @@ static bool cmd_append_full(struct client_command_context *cmd, bool replace)
        o_stream_unset_flush_callback(client->output);
 
        ctx->save_parser = imap_parser_create(client->input, client->output,
-                                             client->set->imap_max_line_length);
+                                             client->set->imap_max_line_length,
+                                             NULL);
        if (client->set->imap_literal_minus)
                imap_parser_enable_literal_minus(ctx->save_parser);
 
index 4278c8720e682d0fdeeb0c6dc98e160f208d3f06..686c72c9840e1c57f7c8339719cde1161ef05ed8 100644 (file)
@@ -289,7 +289,8 @@ cmd_setmetadata_start(struct imap_setmetadata_context *ctx)
           asynchronously the same way as APPEND does. */
        client->input_lock = cmd;
        ctx->parser = imap_parser_create(client->input, client->output,
-                                        client->set->imap_max_line_length);
+                                        client->set->imap_max_line_length,
+                                        NULL);
        if (client->set->imap_literal_minus)
                imap_parser_enable_literal_minus(ctx->parser);
        o_stream_unset_flush_callback(client->output);
index e2bbbc43a2524983a305aa4b03e25d9981b0ca67..f8704ba3094836f4dcbc45353f71c3c9f3dfd228 100644 (file)
@@ -975,7 +975,8 @@ client_command_new(struct client *client)
        } else {
                cmd->parser =
                        imap_parser_create(client->input, client->output,
-                                          client->set->imap_max_line_length);
+                                          client->set->imap_max_line_length,
+                                          NULL);
                if (client->set->imap_literal_minus)
                        imap_parser_enable_literal_minus(cmd->parser);
        }
index e770944b5acaa07f2a422aeecfdd1a5245772c8d..ac3d487589d54a2da38618eabe034437a844d903 100644 (file)
@@ -1876,7 +1876,8 @@ static void imapc_connection_connect_next_ip(struct imapc_connection *conn)
        o_stream_set_flush_callback(conn->output, imapc_connection_connected,
                                    conn);
        conn->parser = imap_parser_create(conn->input, NULL,
-                                         conn->client->set->imapc_max_line_length);
+                                         conn->client->set->imapc_max_line_length,
+                                         NULL);
        conn->to = timeout_add(conn->client->set->imapc_connection_timeout_interval_msecs,
                               imapc_connection_timeout, conn);
        conn->to_output = timeout_add(conn->client->set->imapc_max_idle_time_secs*1000,
index 7f1acb445bc2b04e049191ff569f617e2d5727f2..600fe41b1e019ab7e68ff8fec2856af4412fd095 100644 (file)
@@ -149,7 +149,7 @@ imap_msgpart_get_header_fields(pool_t pool, const char *header_list,
        int result = 0;
 
        input = i_stream_create_from_data(header_list, strlen(header_list));
-       parser = imap_parser_create(input, NULL, SIZE_MAX);
+       parser = imap_parser_create(input, NULL, SIZE_MAX, NULL);
 
        if (imap_parser_finish_line(parser, 0, 0, &args) > 0 &&
            imap_arg_get_list_full(args, &hdr_list, &list_count) &&
index 4bacb495c92199316629760072654531f65dada6..ab30889f122dce66e15c714daf3db47cef883101 100644 (file)
@@ -722,7 +722,7 @@ int imap_bodystructure_parse_full(const char *bodystructure,
        input = i_stream_create_from_data(bodystructure, strlen(bodystructure));
        (void)i_stream_read(input);
 
-       parser = imap_parser_create(input, NULL, SIZE_MAX);
+       parser = imap_parser_create(input, NULL, SIZE_MAX, NULL);
        ret = imap_parser_finish_line(parser, 0,
                                      IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
        if (ret < 0) {
@@ -972,7 +972,7 @@ int imap_body_parse_from_bodystructure(const char *bodystructure,
        input = i_stream_create_from_data(bodystructure, strlen(bodystructure));
        (void)i_stream_read(input);
 
-       parser = imap_parser_create(input, NULL, SIZE_MAX);
+       parser = imap_parser_create(input, NULL, SIZE_MAX, NULL);
        ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE |
                                      IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
        if (ret < 0) {
index da3177025a5e832e8841be6e64d9a898e692f186..f1408a737c39a252274fa6d593183bcfb2dc6d92 100644 (file)
@@ -222,7 +222,7 @@ bool imap_envelope_parse(const char *envelope,
        input = i_stream_create_from_data(envelope, strlen(envelope));
        (void)i_stream_read(input);
 
-       parser = imap_parser_create(input, NULL, SIZE_MAX);
+       parser = imap_parser_create(input, NULL, SIZE_MAX, NULL);
        ret = imap_parser_finish_line(parser, 0,
                                      IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
        if (ret < 0) {
index 643f80ceebbb19eab8680cc57ea670ff6c5ce211..532cb97dfb6e3a2587d7df8d5bb176e1d6994049 100644 (file)
@@ -69,7 +69,8 @@ struct imap_parser {
 
 struct imap_parser *
 imap_parser_create(struct istream *input, struct ostream *output,
-                  size_t max_line_size)
+                  size_t max_line_size,
+                  const struct imap_parser_params *params ATTR_UNUSED)
 {
        struct imap_parser *parser;
 
index cd3748c00f2f5e83243ffb62c97d44d81b390d03..16ef2c7a34e91f777a3705fd9c41b2226b20a8c6 100644 (file)
@@ -38,6 +38,9 @@ enum imap_parser_error {
        IMAP_PARSE_ERROR_LITERAL_TOO_BIG
 };
 
+struct imap_parser_params {
+};
+
 struct imap_parser;
 
 /* Create new IMAP argument parser. output is used for sending command
@@ -53,7 +56,8 @@ struct imap_parser;
    2 * max_line_size. */
 struct imap_parser *
 imap_parser_create(struct istream *input, struct ostream *output,
-                  size_t max_line_size) ATTR_NULL(2);
+                  size_t max_line_size,
+                  const struct imap_parser_params *params);
 void imap_parser_ref(struct imap_parser *parser);
 void imap_parser_unref(struct imap_parser **parser);
 
index 8a09422282b3f98d4e5a621afb826722b5390332..cff2b386c84f5dec834a68619cc4f7f5015fae71 100644 (file)
@@ -16,7 +16,7 @@ static void test_imap_parser_crlf(void)
 
        test_begin("imap parser crlf handling");
        input = test_istream_create(test_input);
-       parser = imap_parser_create(input, NULL, 1024);
+       parser = imap_parser_create(input, NULL, 1024, NULL);
 
        /* must return -2 until LF is read */
        for (i = 0; test_input[i] != '\n'; i++) {
@@ -60,7 +60,7 @@ static void test_imap_parser_partial_list(void)
 
        test_begin("imap parser partial list");
        input = test_istream_create(test_input);
-       parser = imap_parser_create(input, NULL, 1024);
+       parser = imap_parser_create(input, NULL, 1024, NULL);
 
        (void)i_stream_read(input);
        test_assert(imap_parser_read_args(parser, 0,
@@ -128,7 +128,7 @@ static void test_imap_parser_read_tag_cmd(void)
                if (tests[i].type != COMMAND) {
                        input = test_istream_create(tests[i].input);
                        test_assert(i_stream_read(input) > 0);
-                       parser = imap_parser_create(input, NULL, 1024);
+                       parser = imap_parser_create(input, NULL, 1024, NULL);
                        ret = imap_parser_read_tag(parser, &atom);
                        test_assert_idx(ret == tests[i].ret, i);
                        test_assert_idx(ret <= 0 || strcmp(tests[i].tag, atom) == 0, i);
@@ -139,7 +139,7 @@ static void test_imap_parser_read_tag_cmd(void)
                if (tests[i].type != TAG) {
                        input = test_istream_create(tests[i].input);
                        test_assert(i_stream_read(input) > 0);
-                       parser = imap_parser_create(input, NULL, 1024);
+                       parser = imap_parser_create(input, NULL, 1024, NULL);
                        ret = imap_parser_read_command_name(parser, &atom);
                        test_assert_idx(ret == tests[i].ret, i);
                        test_assert_idx(ret <= 0 || strcmp(tests[i].tag, atom) == 0, i);
index 44e024b0f19f42cd8ace132d226046fd70fb88f4..0faf09e27980771a3e59cc1f16c2b1fc0dbb31e4 100644 (file)
@@ -54,7 +54,7 @@ virtual_search_args_parse(const string_t *rule, const char **error_r)
        input = i_stream_create_from_data(str_data(rule), str_len(rule));
        (void)i_stream_read(input);
 
-       imap_parser = imap_parser_create(input, NULL, SIZE_MAX);
+       imap_parser = imap_parser_create(input, NULL, SIZE_MAX, NULL);
        ret = imap_parser_finish_line(imap_parser, 0,  0, &args);
        if (ret < 0) {
                sargs = NULL;